/* Copyright (c) 2008 Kean Loong Tan http://www.gimiti.com/kltan
 * Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
 * Copyright notice and license must remain intact for legal use
 * jSuggest
 * Version: 1.0 (May 26, 2008)
 * Requires: jQuery 1.2.6+
 */
(function($) {

    $.fn.jSuggest3 = function(options) {
        // merge users option with default options
        var opts = $.extend({}, $.fn.jSuggest3.defaults, options);
        var jH = ".jSuggestHover3";
        var jsH = "jSuggestHover3";
        var iniVal = this.value;
        var textBox = this;
        var textVal = this.value;
        var jC = "#jSuggestContainer3";

        $("body").append('<div id="jSuggestContainer3"></div>');
        $(jC).hide();
        $(this).bind("keyup click", function(e) {
            textBox = this;
            textVal = this.value;
            if (this.value.length >= opts.minchar && $.trim(this.value) != "Search Terms") {
                var offSet = $(this).offset();

                $(jC).css({
                    position: "absolute",
                    top: offSet.top + $(this).outerHeight() + "px",
                    left: offSet.left,
                    width: $(this).outerWidth() - 2 + "px",
                    opacity: opts.opacity,
                    zIndex: opts.zindex
                }).show();

                // if escape key
                if (e.keyCode == 27) {
                    $(jC).hide();
                }

                // if enter key
                else if (e.keyCode == 13) {
                    if ($(jH).length == 1)
                        $(textBox).val($(jH).text());
                    $(jC).hide();
                    iniVal = textBox.value;
                }
                // if down arrow
                else if (e.keyCode == 40) {
                    // if any suggestion is highlighted
                    if ($(jH).length == 1) {
                        if (!$(jH).next().length == 0) {
                            $(jH).next().addClass(jsH);
                            $(".jSuggestHover3:eq(0)").removeClass(jsH);
                            if (opts.autoChange)
                                $(textBox).val($(jH).text());
                        }
                    }
                    else {
                        $("#jSuggestContainer3 ul li:first-child").addClass(jsH);
                        if (opts.autoChange)
                            $(textBox).val($(jH).text());
                    }

                }

                // if up arrow
                else if (e.keyCode == 38) {
                    // if any suggestion is highlighted
                    if ($(jH).length == 1) {
                        if (!$(jH).prev().length == 0) {
                            $(jH).prev().addClass(jsH);
                            $(".jSuggestHover3:eq(1)").removeClass(jsH);
                            if (opts.autoChange)
                                $(textBox).val($(jH).text());
                        }
                        // if is first child
                        else {
                            $(jH).removeClass(jsH);
                            $(textBox).val(iniVal);
                        }
                    }
                }
                // new query detected
                else if (textBox.value != iniVal) {
                    iniVal = textBox.value;
                    if ($(".jSuggestLoading3").length == 0)
                        $('<div class="jSuggestLoading3"><img src="' + opts.loadingImg + '" align="bottom" /> ' + opts.loadingText + '</div>').prependTo("#jSuggestContainer3");

                    $(".jSuggestLoading3").show();
                    $(jC).find('ul').remove();

                    //  if (opts.data == '')
                    //   opts.data = $(this).serialize();
                    //  else
                    //    opts.data = opts.data + "=" + $(this).val();
                    var thisdata = {};
                    if (opts.data == '') {
                        thisdata[$(this).attr('name')] = $(this).val();
                    } else {
                        thisdata[opts.data] = $(this).val();
                    }
                    var realdata = $.extend({}, thisdata, opts.extradata);
                    //alert(realdata);
                    // optimize server performance by loading at intervals
                    setTimeout(function () {
                        $.ajax({
                            type: opts.type,
                            url: opts.url,
                            //   data: opts.data,
                            data: realdata,
                            success: function(msg) {
                                $(jC).find('ul').remove();
                                $(jC).append(msg);
                                $("#jSuggestContainer3 ul li").bind("mouseover", function() {
                                    $(jH).removeClass(jsH);
                                    $(this).addClass(jsH);
                                    textVal = $(this).text();
                                    if (opts.autoChange)
                                        $(textBox).val($(jH).text());
                                });
                                $("#jSuggestContainer3 ul li").click(function() {
                                    $(this).addClass(jsH);
                                    $(textBox).val(textVal);
                                });
                                $(".jSuggestLoading3").hide();
                            }
                        });
                    }, opts.delay);
                }
            }
            // if text is too short do nothing and hide everything
            else {
                $(jH).removeClass(jsH);
                $(jC).hide();
            }

            // no bubbling, click is binded to textBox to prevent document bind from firing
            return false;
        });

        // why no use $(this).blur ?, because jSuggest box is hidden before click fires so this is the only way to do it
        // alternate way is to say that text blur will fire before$("#jSuggestContainer ul li") click.
        $(document).bind("click", function() {
            $(jC).hide();
            iniVal = textBox.value;
        });

    };

    $.fn.jSuggest3.defaults = {
        minchar: 1,
        opacity: 1.0,
        zindex: 20000,
        delay: 500,
        loadingImg: 'images/ajax-loader.gif',
        loadingText: 'Loading...',
        autoChange: false,
        url: "",
        type: "GET",
        data: ""
    };


})(jQuery);